home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
select
/
select.c
< prev
next >
Wrap
Text File
|
1995-02-18
|
8KB
|
347 lines
/*
r.m=80 tab=4
=======================================================================
== <<バッチ分岐支援プログラム>> ==
== [ select.exe ] Ver 0.10 ==
== 1995 Program : Y.Gotoh ==
=======================================================================
*/
/*外部ファイル読み込み */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <gds.h>
#include "gotoh.h"
/* グローバル変数の設定 */
int center=1; /* 選択肢の表示位置。初期(1)は中央 */
int end_echo=0; /* エンディングエコーの表示非表示。初期(0)は非表示 */
int g_clear=0; /* 実行後のグラフィックのクリア。初期(0)はしない。 */
int under_bar=1; /* アンダーバー変換。初期(1)はする。*/
int sel_color=3; /* 選択肢の色、初期(3)は黄色 */
char *sel[20]; /* select群で使用 */
char *help={ /* ヘルプメッセージ */
"\n"
" \"select.exe\" Ver 0.10 1995 : Y.Gotoh (Gori)\n"
"\n"
" select.exe [option] title sel_1 sel_b sel_c ・・・\n"
" /b[r][g][b] ・・・ Back color [r],[g],[b]で背景を塗ります.\n"
" /c[n] ・・・ selector Color カーソルの色を[n]に変更します.\n"
" /e ・・・ Eending echo 終了時メッセージを表示します.\n"
" /g ・・・ Graphic clear グラフィックを消去します.\n"
" /h , /? ・・・ Help ヘルプを表示します.\n"
" /l ・・・ at the Left 選択肢を左寄せにします.\n"
" /_ ・・・ not change '_' アンダーバーを変換しません.\n"
"\n"
" ==メニューの使い方==\n"
" [↑],[F],[E] ・・・・・・・・・・ カーソルを上へ移動\n"
" [↓],[J],[X] ・・・・・・・・・・ 〃 下 〃 \n"
" [ret],[space] ・・・・・・・・・・ 決定\n"
" [0~9] ・・・・・・・・・・ その番号のメニューを実行\n"
" [esc],[Q],[q] ・・・・・・・・・・ 終了\n\n"
};
/* 関数の定義 */
/* 雑用関数 */
void waitkey( int wait_time);
void HELP( void );
void center_puts( int y , char *msg);
/* セレクト群関数 */
int select(int sel_max);
void select_list(int sel_max);
void select_prt(int sel_no,int sel_bak);
void select_cprt(int num);
/* メイン */
int main(int argc , char *argv[])
{
/* 初期設定 */
int ret,sel_max=-1,i,j; /* sel_maxは後の所で修正されるため初期値 */
/* は(-1)とする */
int pal[3]={0,0,0}; /* 背景パレット */
char dmy; /* 雑用char*/
/* 画面消去・設定 */
txt_cls();
txt_csl(0); /* カーソル表示off */
GDS_write_page(1); /* page1を使用 */
GDS_display_page(1);
if(g_clear)
{
GDS_all_clear();
}
/* パラメータの読み込み */
if(argc<2) HELP(); /* パラメータ無しはヘルプ表示 */
for(i=1;i<argc;i++)
{
if(*(argv[i])=='/' || *(argv[i])=='-') /* '/','-'のどちらにも対応 */
{
tolower( *(argv[i]+1) );
switch(*(argv[i]+1))
{
case 'b':
strlwr(argv[i]);
for(j=2;j<strlen(argv[i]);j++)
{
dmy=*(argv[i]+j);
if(dmy>=0x61 && dmy<=0x66) /* a~fは10~15へ */
{
pal[j-2]=(9+(dmy-0x60))*16;
}
else pal[j-2]=(atoi(&dmy))*16;
}
GDS_palette(0,pal[0],pal[1],pal[2]);
break;
case 'c':
dmy=*(argv[i]+2);
if(dmy>=0x30 && dmy<=0x37)
{
sel_color=atoi(&dmy);
}
else sel_color=3;
break;
case 'e': /* 終了メッセージを表示する */
end_echo=1;
break;
case 'g': /* G画面の消去をする */
g_clear=1;
break;
case 'h': /* ヘルプ */
case '?':
HELP();
break;
case 'l':
center=0; /* 選択肢を左寄せ */
break;
case '_': /* アンダーバー変換をしない */
under_bar=0;
break;
default:
printf("オプション[%c]には未対応.\n",*(argv[i]+1));
waitkey(10);
}
}
else
{
sel_max++;
sel[sel_max]=argv[i];
}
}
if(sel_max<2)
{
txt_color(1); /* 赤 */
printf("\nerror!! 選択肢の数が足りません!!\n");
txt_color(7); /* 白 */
HELP();
}
if(under_bar) /* under_barが0なら処理をしない */
{
for(i=0;i<=sel_max;i++)
{
for(j=0;j<strlen(sel[i]);j++) /* アンダーバーをス */
{ /* ペースに変換する。 */
if( *(sel[i]+j)=='_' )
{
*(sel[i]+j)=' ';
}
}
}
}
/* タイトル */
locate(20,1);
txt_color(3);
printf( "------------------------------------------\n");
locate(20,2);
printf( " [select,exe] 1995 program : Y.Gotoh \n");
locate(20,3);
printf( "------------------------------------------\n");
txt_color(7);
/* メイン */
ret=select(sel_max); /* 選択ルーチンへ */
if(ret==-1) ret=0; /* エスケープ終了は通常終了にする */
/* 終了処理 */
txt_cls();
if(end_echo) /* end_echo が 0 以外ならメッセージ表示 */
{
printf( "[select.exe] Ver 0.10 program : Y.Gotoh\n"
" returned error level [%d]\n",ret);
}
txt_csl(1); /* カーソルの表示 */
if(g_clear) GDS_palette(0,0,0,0); /* g_clearが0以外なら画面消去 */
exit(ret);
}
/* ヘルプを表示するサブ */
void HELP(void)
{
printf("%s",help);
exit(0);
}
/* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
int select(int sel_max)
{
int sel_no=1,sel_bak=1,ret=0;
char key='\0'; /* とりあえずループさせるために */
center_puts(5,sel[0]); /* タイトル表示 */
select_list(sel_max); /* 一覧表示 */
select_prt(sel_no,sel_bak); /* 初期位置(1)にカーソルを持ってくる */
do
{
key=getch();
key=tolower(key);
/* [↑,F,E]の時 */
if(key=='\x1e' || key=='\x66' || key=='\x65')
{
sel_bak=sel_no;
sel_no--;
if(sel_no<1) sel_no=sel_max;
select_prt(sel_no,sel_bak);
}
/* [↓,J,X]の時 */
if(key == '\x1f' || key=='\x6a' || key=='\x78')
{
sel_bak=sel_no;
sel_no++;
if(sel_no>sel_max) sel_no=1;
select_prt(sel_no,sel_bak);
}
/* 各数字(0~9)が押された時 */
if(key >= '\x30' && key <= '\x39')
{
sel_bak=sel_no;
sel_no=(int)key-0x30;
if(sel_no==0) sel_no=10;
if(sel_no>sel_max)
{
sel_no=sel_bak;
}
else
{
select_prt(sel_no,sel_bak);
waitkey(20);
key='\x0d';
}
}
}while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
if(key == '\x0d' || key == '\x20' ) ret=sel_no; /* [space],[ret]なら
選択番号を返す */
if(key == '\x71') ret=0; /* [Q],[q]なら終了(ret=0) */
if(key == '\x1b') ret=-1; /* [esc]なら-1を返す */
return(ret);
}
/* 選択肢一覧表示 */
void select_list(int sel_max)
{
int i;
for(i=1;i<=sel_max;i++)
{
if(center)
{
select_cprt(i);
}
else
{
locate(18,i+6);
printf("%2d: %s",i,sel[i]);
}
}
}
/* 選択カーソル表示ルーチン */
void select_prt(int sel_no,int sel_bak)
{
if(center)
{
select_cprt(sel_bak);
printf("\x1b[7;%dm",sel_color+30); /* テキスト属性をリバースに */
select_cprt(sel_no);
printf("\x1b[0;37m"); /* 元に戻す */
}
else
{
/* 帯を消す */
locate(18,sel_bak+6);
printf("%2d: %s",sel_bak,sel[sel_bak]);
/* 新しく帯を引く */
locate(18,sel_no+6);
printf("\x1b[7;%dm%2d: %s\x1b[0;37m",sel_color+30,sel_no,sel[sel_no]);
}
}
void select_cprt(int num)
{
locate(18,num+6); /* 数字のみは左寄せで表示 */
printf("%2d:",num);
center_puts(num+6,sel[num]);
}
/* サブルーチン */
/* 文字列を中央に表示するサブ */
void center_puts(int y,char *msg)
{
int x=40-(strlen(msg)/2);
locate(x,y);
printf("%s",msg); /* 本来はputsを使用するが、このプログラムでそれを */
/* するとファイルサイズの増加につながるために、pr */
/* intfを使用 */
}
/* 何かキーを押すか一定時間経つと処理を復帰するサブ */
void waitkey(int wait_time)
{
int i=0;
for(i=0;i<wait_time*10;i++)
{
if( kbhit() != 0) break;
}
}